1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include <cstdio> #include <algorithm> #define int long long const int maxn = 505; const int mo = 1e9 + 7; using namespace std; int a[maxn], b[maxn], f[maxn << 1][maxn], sum[maxn << 1], lim[maxn << 1]; int n, ans = 0, tmp[maxn << 1], inv[maxn << 1]; signed main(){
scanf("%lld", &n); for (int i = 1; i <= n; i++){ scanf("%lld%lld", a + i, b + i); tmp[i * 2 - 1] = a[i]; tmp[i * 2] = b[i] + 1; } sort(tmp + 1, tmp + 2 * n + 1); int cnt = unique(tmp + 1, tmp + 2 * n + 1) - tmp - 1; for (int i = 1; i <= n; i++){ a[i] = lower_bound(tmp + 1, tmp + cnt + 1, a[i]) - tmp; b[i] = lower_bound(tmp + 1, tmp + cnt + 1, b[i] + 1) - tmp; } inv[1] = 1; for (int i = 2; i <= n * 2; i++) inv[i] = 1ll * inv[mo % i] * (mo - mo / i) % mo; f[0][0] = 1; for (int j = 0; j < cnt; j++) sum[j] = 1; for (int i = 1; i <= n; i++){ for (int j = a[i]; j < b[i]; j++){ ++lim[j]; for (int k = lim[j] - 1; k >= 1; k--) f[j][k + 1] = (f[j][k + 1] + 1ll * f[j][k] * (tmp[j + 1] - tmp[j] - k) % mo * inv[k + 1] % mo) % mo; f[j][1] = (f[j][1] + 1ll * sum[j - 1] * (tmp[j + 1] - tmp[j]) % mo) % mo; } for (int j = 1; j < cnt; j++){ sum[j] = sum[j - 1]; for (int k = lim[j]; k >= 0; k--) sum[j] = (sum[j] + f[j][k]) % mo; } } printf("%lld\n", (sum[cnt - 1] - 1 + mo) % mo); return 0; }
|